package com.ruoyi.goods.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.goods.vo.CategoryVo;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.goods.mapper.CategoryMapper;
import com.ruoyi.goods.domain.Category;
import com.ruoyi.goods.service.ICategoryService;
import org.springframework.util.CollectionUtils;

/**
 * 物品分类信息Service业务层处理
 *
 * @author yeqi
 * @date 2022-11-27
 */
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements ICategoryService {

    /**
     * 查询物品分类信息列表
     *
     * @param category 物品分类信息
     * @return 物品分类信息
     */
    @Override
    public List<Category> selectCategoryList(Category category) {
       if (category.getParentId() != null){
           Category parentCate = getBaseMapper().getByParentId(Long.valueOf(category.getParentId()));
           category.setBusiPath(parentCate.getBusiPath());
       }
        return getBaseMapper().selectCategoryList(category);
    }

    @Override
    public List<CategoryVo> TreeList() {
        // 查询出所有的
        List<Category> categories = getBaseMapper().selectCategoryList(new Category());
        ArrayList<CategoryVo> cateVos = new ArrayList<>();
        HashMap<Long, CategoryVo> map = new HashMap<>();
        for (Category category : categories) {
            CategoryVo vo = new CategoryVo();
            vo.setLabel(category.getCategoryName());
            vo.setValue(category.getId()+"");
            map.put(category.getId(), vo);
        }
        for (Category category : categories) {
            // 如果 ID不为空
            CategoryVo vo = map.get(category.getId());
            String parentId = category.getParentId();
            if (parentId !=null){
                CategoryVo categoryVo = map.get(Long.valueOf(parentId));
                List<CategoryVo> childList = categoryVo.getChildren();
                childList.add(vo);
            }else {
                cateVos.add(vo);
            }
        }

        return cateVos;
    }

    @Override
    public boolean delectById(Long id) {
        // 删除时 基于 id 查询 旗下所有的子节点删除 如果有子节点 循环查询子节点是否有 关联的 商品 有 无法删除 无 删除
            Category category = getById(id);
            // 如果当前节点下或 子节点有商品 那么无法删除
            int count = getBaseMapper().selectGoodsByCategoryBuisPath(category.getBusiPath());
            if (count != 0){
                throw new ServiceException("无法删除该分类下有商品,请先删除其下面的商品");
            }
            List<Category> categories = getBaseMapper().selectByBusiPath(category.getBusiPath());
            if (!CollectionUtils.isEmpty(categories)){
                List<Long> longs = categories.stream().map(Category::getId).collect(Collectors.toList());
                return super.removeBatchByIds(longs);
            }
        return super.removeById(id);
    }

    /**
     * 添加物品分类
     */
    @Override
    public boolean save(Category entity) {
        // // 如果前端传过来有 没有id 那么,id层级结构就以1开头 把它当作这个分类的 父节点
        // if (entity.getId() == null){
        //
        //     entity.setBusiPath("1");
        //     entity.setId(null);
        //     return super.save(entity);
        // }else {
        //     // 如果前端传过来了Id, 那么 基于该 ID查询该条数据 , 判断该条数据有没有父Id, 如果没有父 id,
        //     Category category = getById(entity.getId());
        //     int size ;
        //     if (category.getParentId() == null){
        //         // 基于该条数据的 id层级结构去模糊查询该层级下的所有子 id parent id = 该条数据Id
        //         // List<Category> list = getBaseMapper().selectByBusiPath(category.getBusiPath(),category.getId());
        //         // 修改: 该条数据的 id 为 父 id 的查询下级子列表
        //         List<Category> list = getBaseMapper().selectByParentId(category.getId());
        //         if (CollectionUtils.isEmpty(list)){
        //             // 如果没有查到 那么 这条数据 为当前父id 下的第一条
        //             entity.setParentId(category.getId() + "");
        //             // id层级 为 该 父 ID : 1
        //             entity.setBusiPath(category.getId() + ":" + 1);
        //             // 清空 id (不知道 前端传 id 过来 不清空会不会有问题)
        //             entity.setId(null);
        //             return super.save(entity);
        //         }else {
        //             // 如果查到了 那么,这条数据,为当前父id 查询出集合的 size+1 条数据
        //              size = list.size() +1;
        //             entity.setBusiPath(category.getBusiPath() + ":" +size);
        //             // 这个就为该条数据的父ID
        //             entity.setParentId(category.getId() +"");
        //             entity.setId(null);
        //             return super.save(entity);
        //         }
        //     }
        //         // 如果 有父id ,那么 就基于 该 父 id 查询 旗下所有子节点
        //         // 该 添加的id层级为 集合的 size +1
        //    List<Category> list =  getBaseMapper().selectByParentId(Long.valueOf(entity.getParentId()));
        //     size = list.size() +1;
        //     entity.setBusiPath(entity.getBusiPath()+":" +size);
        //     entity.setId(null);
        // }

        // 如果前端未传入父 ID 那么 该数据就未父节点  该数据的 id为 busipath
        if (entity.getParentId() == null){
            super.save(entity);
            // 该数据的 id为 busipath
            entity.setBusiPath(entity.getId() + "");
            return updateById(entity);
        }else {
            // // 如果前端传入父 id 那么 基于 父 id 去查询其下的子节点个数 基于个数 +1
            // List<Category> list = getBaseMapper().selectByParentId(Long.valueOf(entity.getParentId()));
            // 查询该父id 所对应的对象
            Category parentCategory =  getBaseMapper().getByParentId(Long.valueOf(entity.getParentId()));
            super.save(entity);
            entity.setBusiPath(parentCategory.getBusiPath()+ ":" +entity.getId());
            return super.updateById(entity);
            // if (CollectionUtils.isEmpty(list)){
            //     // 如果查出来集合为空 那么 该数据为这个父id 下的 第一个数据
            //     entity.setBusiPath(parentCategory.getBusiPath() + ":" + 1);
            //     return super.save(entity);
            // }else {
            //     int size = list.size() +1;
            //     entity.setBusiPath(parentCategory.getBusiPath() + ":" + size);
            //     return super.save(entity);
            // }
        }

    }

}
